Skip to content

feat(observability): add SWIFT networking user journey monitoring (ARO-25382) - #6359

Draft
Andrew Denton (ventifus) wants to merge 2 commits into
Azure:mainfrom
ventifus:adenton/userjourney/ARO-25382-swift
Draft

feat(observability): add SWIFT networking user journey monitoring (ARO-25382)#6359
Andrew Denton (ventifus) wants to merge 2 commits into
Azure:mainfrom
ventifus:adenton/userjourney/ARO-25382-swift

Conversation

@ventifus

@ventifus Andrew Denton (ventifus) commented Jul 31, 2026

Copy link
Copy Markdown

https://redhat.atlassian.net/browse/ARO-25382

docs/drafts/ contains working drafts of the SWIFT user journey and TSG, included for co-review with the observability code. After review they will be published to eng.ms/ADO and removed from this PR.

What

User journey, TSG, and alerting for SWIFT networking on ARO-HCP management clusters.

  • User Journey: architecture, SLI/SLO definitions, TSG routing table, escalation contacts
  • TSG: alert triage, diagnostic steps, mitigation scenarios, CNS and konnectivity metrics reference
  • Design docs: rationale behind alert naming, SLI design, and dashboard panels
  • CNS PodMonitor: scrapes CNS metrics from management cluster nodes
  • Konnectivity PodMonitor: scrapes konnectivity-server metrics from KAS pods (port 8093)
  • RP per-HCP alert lane wired into rp-rules.bicep
  • Alerts (all with promtool tests):
Alert SLI Threshold
userJourneySwiftLatencyP99{1h5m,6h30m} Router pod startup latency p99 300s
userJourneySwiftErrors{1h5m,6h30m} CNS IP assignment error rate 1%
userJourneySwiftCNSLatencyP99{1h5m,6h30m} CNS IP assignment latency p99 10s
userJourneySwiftKonnectivityErrors{1h5m,6h30m} Konnectivity tunnel stream error rate 1%
userJourneySwiftKonnectivityDialFailures{1h5m,6h30m} Konnectivity dial failure rate 1%
SwiftCNSAvailability3d CNS daemonset availability 99.9%
SwiftPendingProgramming IPs in PendingProgramming 0 sustained

Why

SWIFT provides the private network path between customer VNets and hosted control planes. When it fails, worker nodes go NotReady, webhooks break, and cert rotations fail. This PR adds observability at two layers:

  1. NIC assignment layer (CNS metrics): CNS runs on every management cluster node but was never scraped. The PodMonitor, recording rules, and alerts measure whether secondary NICs are being assigned to router pods within latency/error targets.
  2. Tunnel layer (konnectivity metrics): konnectivity-server runs as a sidecar in each KAS pod. The PodMonitor, recording rules, and alerts measure whether the KAS-to-node tunnel is healthy (stream errors, dial failures).

Test plan

  • make alerts and make recording-rules pass; all promtool tests green
  • CNS metrics and KSM metrics confirmed flowing to AMW in pers
  • Recording rule and alert groups confirmed deployed in pers
  • Live router pod data validation requires a SWIFT-provisioned HCP (follow-up)

@openshift-ci

openshift-ci Bot commented Jul 31, 2026

Copy link
Copy Markdown

Hi Andrew Denton (@ventifus). Thanks for your PR.

I'm waiting for a Azure member to verify that this patch is reasonable to test. If it is, they should reply with /ok-to-test on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work.

Tip

We noticed you've done this a few times! Consider joining the org to skip this step and gain /lgtm and other bot rights. We recommend asking approvers on your previous PRs to sponsor you.

Once the patch is verified, the new status will be reflected by the ok-to-test label.

I understand the commands that are listed here.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@ventifus
Andrew Denton (ventifus) force-pushed the adenton/userjourney/ARO-25382-swift branch from 6049995 to 98bedfc Compare July 31, 2026 22:48

@sravyanimmala Lakshmi Sravya Nimmala (sravyanimmala) left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed uj-tsg-swift.md — solid draft overall. Left some comments: one fix (missing deployment name in a kubectl command) and suggestions to add Goal/Preconditions to the four Mitigation scenarios,plus small additions to Validation and after Incident.

Comment thread docs/drafts/uj-tsg-swift.md Outdated

```bash
# Restart mgmt-agent to force a resync of NIC capacity
kubectl rollout restart deployment -n mgmt-agent

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This command is missing the deployment name .kubectl rollout restart deployment -n mgmt-agent will restart all deployments in the mgmt-agent namespace, not just the intended one. Confirmed via mgmt-agent/deploy/templates/deployment.yaml that the actual deployment name is mgmt-agent. Should be:
kubectl rollout restart deployment mgmt-agent -n mgmt-agent


# Mitigation

## Scenario: Stuck MTPNC deletion (MTPNC has DeletionTimestamp, finalizer not clearing)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good context and fix options here, with a nice Risk callout. Per the TSG template, this scenario should also explicitly state Goal and Preconditions before the fix options, so the SRE knows why they’re doing this and when it’s safe to apply.
Suggested:
Goal: Unblock a MultiTenantPodNetworkConfig stuck in DeletionTimestamp with a finalizer DNC-RC never cleared, so the router pod can be recreated.
Preconditions: Confirmed the MTPNC has a non-null DeletionTimestamp and the finalizer is still present (per the chain described above); DNC-RC logs show no active reconciliation attempt in the last 10+ minutes.


> **Risk:** Draining a node evicts all pods on it. Confirm no critical workloads are pinned and check PodDisruptionBudget constraints before proceeding.

## Scenario: mgmt-agent reporting zero SWIFT NICs on a node

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing Goal and Preconditions here too, similar to the previous scenario.
Suggested:
Goal: Force mgmt-agent’s SwiftNICController to re-query the Azure Compute API and republish the node’s SWIFT NIC capacity, without disrupting workloads already running on the node.
Preconditions: Confirmed via node status that node.status.capacity[‘aro.openshift.io/swift-nic’] is 0 or missing, while the VMSS instance itself shows secondary NICs attached in Azure. Worth noting explicitly that this restart uses Server-Side Apply per the controller code, so it should only resync existing state rather than disrupt running pods -stating that up front would give the on-call SRE more confidence before running it.

kubectl rollout restart deployment -n mgmt-agent
```

## Scenario: CNS not running on a node (HCP side)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as the other scenarios above — missing Goal and Preconditions before the fix steps.
Suggested:
Goal: Restore the CNS pod to Running so it resumes handing out IPs on the node.
Preconditions: CNS pod confirmed not Running (CrashLoopBackOff, Pending, or missing entirely).


Escalate to the Azure AKS team if CNS cannot be restarted or the crash is not caused by HCP configuration.

## Scenario: Azure platform issue (NRP / DNC / AKS RP regression)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as the other scenarios above — missing Goal and Preconditions before the escalation steps.
Goal: Escalate to the correct Microsoft team once ARO-HCP-side causes have been ruled out.
Preconditions: Prior diagnostic steps found no ARO-HCP-owned root cause, and Azure platform signals (AKS/NRP) are showing an anomaly.


> **TODO:** Document the exact process for Red Hat SREs to open an IcM against Microsoft teams (AME account requirements, IcM queue IDs). Confirm with #external-wg-aro-hcp.

# Validation and Confirmation

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice checklist here. One addition worth considering: this confirms internal system state (pods, metrics, alerts, node status), but doesn't explicitly loop back to confirm the customer-visible symptoms from earlier in the TSG have cleared — specifically, webhook failures and cert rotation issues were both called out as customer-visible symptoms. Might be worth a line confirming those two specifically resolved, since they're what originally indicated customer impact.

# After Incident

## Postmortem Notes

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good postmortem checklist here. One gap: nothing says when this actually needs a formal PMR versus just these notes. Could we add a line on that, plus a link to the PMR process if we have one?

Comment thread docs/drafts/uj-runbook-swift.md Outdated
…O-25382)

Add User Journey, TSG, and alerting for SWIFT networking on ARO-HCP
management clusters.

User Journey (new 4-section template format):
- Journey: customer and SRE goals for private HCP connectivity
- Architecture: mermaid diagram of happy-path NIC assignment flow,
  component table, glossary of SWIFT-specific terms
- SLIs/SLOs/TSG Routing: single table mapping each SLI to its SLO,
  alert names, and TSG entry point
- Escalation: per-team blocks for Cloudnet/NRP, Azure AKS, NMAgent

TSG (8-section template):
- Alert triage table routing each alert to a diagnostic step
- Cluster access (JIT + hcpctl + breakglass guide)
- Glossary, full severity table (Platform Incident + CRI paths)
- Diagnostic steps: blast radius, HCP-side prereqs, CNS log
  classification, AKS Kusto queries, Azure platform signals
- Mitigation scenarios: stuck MTPNC, mgmt-agent NIC capacity, CNS
- Escalation with evidence-to-attach per team
- CNS Prometheus metrics and recording rules appendices

Alerting and recording rules:
- Recording rules for router pod startup latency p99 (kube-state-metrics)
  and CNS IP assignment latency p99 (CNS PodMonitor)
- Alerts: userJourneySwiftLatencyP99 (fast/medium/slow burn),
  userJourneySwiftErrors (fast/medium burn),
  userJourneySwiftCNSLatencyP99 (fast/medium burn),
  SwiftCNSAvailability3d, SwiftPendingProgramming
- promtool test coverage for all alerts
- CNS PodMonitor for scraping azure-cns metrics

Design docs (drafts, not published):
- uj-alerts-swift.md: alert naming, routing lanes, burn-rate tiers
- uj-slislo-swift.md: SLI design rationale, recording rule chain
- uj-dashboard-swift.md: Grafana dashboard panel specifications
@ventifus
Andrew Denton (ventifus) force-pushed the adenton/userjourney/ARO-25382-swift branch from 98bedfc to 30f1ac0 Compare August 7, 2026 14:09
@openshift-ci

openshift-ci Bot commented Aug 7, 2026

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: ventifus
Once this PR has been reviewed and has the lgtm label, please assign venkateshsredhat for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@ventifus
Andrew Denton (ventifus) force-pushed the adenton/userjourney/ARO-25382-swift branch from 351ef4d to 5025564 Compare August 10, 2026 18:01
- Fully spec konnectivity tunnel health SLIs (stream error rate,
  dial failure rate) across all design docs: SLI/SLO, alerts,
  dashboard, and implementation spec
- Fix TSG cross-references: "Step 4" -> "Step 5" matching anchors
- Rewrite implementation spec: correct file names, alert name
  prefix, add konnectivity recording rules and alerts
- Add slow-burn tier (userJourneySwiftLatencyP993d) to alerts doc
- Add konnectivity panels to dashboard design doc
- Add konnectivity-server PodMonitor (port 8093)
@ventifus
Andrew Denton (ventifus) force-pushed the adenton/userjourney/ARO-25382-swift branch from 5025564 to 35521d8 Compare August 10, 2026 22:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants